import Diccionario
import Maybe

---- Este módulo sirve para utilizar el diccionario sin acceder ----
---- a su estructura interna.                                   ----
---- Pueden agregar otras funciones o casos de prueba.          ----


------------------------------------------------------------------------
---- Función a Implementar. ----
------------------------------------------------------------------------

busquedaDelTesoro :: Eq a => a -> (a -> Bool) -> Diccionario a a -> Maybe a 
busquedaDelTesoro inicial esTesoro dicc = 
    firstTrue esTesoro (aplicaciones inicial dicc)

---- Busca primera ocurrencia de p x ----
firstTrue :: Eq a => (a -> Bool) -> [Maybe a] -> Maybe a
firstTrue p = foldr (\x rec -> if p (fromJust x) then x else rec) Nothing

---- Al primer Nothing para ----
aplicaciones :: Eq a => a -> Diccionario a a -> [Maybe a]
aplicaciones inicial dicc = takeWhile (not . isNothing) (infinitasAplicaciones inicial dicc)

---- Lista Infinita ----
infinitasAplicaciones :: Eq a => a -> Diccionario a a -> [Maybe a]
infinitasAplicaciones inicial dicc = iterate (maybeObtener dicc) (Just inicial)


------------------------------------------------------------------------

---- Este TP está auspiciado por: ----

----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@Oc   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@8c          O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@C               8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@.                  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@.                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@O                  .@@@@8c   o@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@                        :O@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@                  c8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@                 :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@o                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@c     cO@@@O o@@@@@@:      O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@O .o@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O     o@@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o     o@@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:     O@@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O.           .8@@@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@O                 @@@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@8  :.8@@@C         :         o@@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@ c@@@@@@:         O@o         :@8C@@c @@@@@@@@@----
----@@@@@@@@@@@@@@@@@  :@@@:          @@@@:          @@@@C C@@@@@@@@----
----@@@@@@@@@@@@@@@@@@               @@@@@@                @@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@8ocoC@      @@@@@@@@      8c   .o@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@O      @@@@@@@@@O      @@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@O     :@@@@@@@@@@@O     :@@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@O     :@@@@@@@@@@@@@o     o@@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@O     :@@@@@@@@@@@@@@@:     O@@@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@o     :@@@@@@@@@@@@@@@@@       o@@@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@o     o@@@@@@@@@@@@@@@@@@@:        @@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@:     O@@@@@@@@@@@@@@@@@@@@@@o     o@@@@@@@@@@----
----@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----
------------------------------------------------------------------------
-------------------------------------------------------- SIR LAMBDA ----
------------------------------------------------------------------------
--------------------------- LIKE A LAMBDA SIR --------------------------
------------------------------------------------------------------------
